package factura.util;

import java.io.File;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import factura.modelo.reportes.FacturaReporte;
import factura.modelo.reportes.ReporteUtil;
import factura.modelo.xml.Factura;
import factura.modelo.xml.XML2Java;

public class VisualizacionRideUtil {
	private static final String ESTADO = "AUTORIZADO";

	public static void decodeArchivoBase64(String nombreArch,
			String numeroAutorizacion, String fechaAut) {
		try {
			File file = new File(nombreArch);
			if (file.exists()) {
				DocumentBuilderFactory factory = DocumentBuilderFactory
						.newInstance();
				DocumentBuilder builder = factory.newDocumentBuilder();
				Document doc = builder.parse(file);
				NodeList list = doc.getElementsByTagName("*");
				String docu = null;
				String numeroAut = "";
				String fechaAutorizacion = "";
				String estado = "";
				for (int i = 0; i < list.getLength(); i++) {
					Element element = (Element) list.item(i);
					if (element.getNodeName().equals("comprobante")) {
						docu = element.getChildNodes().item(0).getNodeValue();
					}
					if (element.getNodeName().equals("estado")) {
						estado = element.getChildNodes().item(0).getNodeValue();
					}
					if ((numeroAutorizacion == null) && (fechaAut == null)) {
						if (element.getNodeName().equals("numeroAutorizacion")) {
							numeroAut = element.getChildNodes().item(0)
									.getNodeValue();
						}
						if (element.getNodeName().equals("fechaAutorizacion")) {
							fechaAutorizacion = fechaAutorizacion
									+ element.getChildNodes().item(0)
											.getNodeValue();
						}
					}
				}
				if ((fechaAut == null) && (numeroAutorizacion == null)) {
					fechaAut = fechaAutorizacion;
					numeroAutorizacion = numeroAut;
				}
				if ("AUTORIZADO".equalsIgnoreCase(estado)) {
					generar(docu, numeroAutorizacion, fechaAut);
				} else {
					JOptionPane
							.showMessageDialog(
									new JPanel(),
									"El archivo seleccionado no es un comprobante autorizado.",
									"ERROR", 0);
				}
			} else {
				Logger.getLogger(VisualizacionRideUtil.class.getName()).log(
						Level.INFO, "No existe archivo");
			}
		} catch (Exception e) {
			Logger.getLogger(VisualizacionRideUtil.class.getName()).log(
					Level.SEVERE, null, e);
		}
	}

	private static void generar(String docu, String numeroAutorizacion,
			String fechaAut) {
		if (docu != null) {
			File c = ArchivoUtils.stringToArchivo("factura.xml", docu);
			if (obtenerTipoComprobante(docu).equals("FA")) {
				try {
					Factura f = XML2Java.unmarshalFactura(c.getPath());
					FacturaReporte fr = new FacturaReporte(f);
					generarReporte(fr, numeroAutorizacion, fechaAut);
				} catch (Exception ex) {
					Logger.getLogger(VisualizacionRideUtil.class.getName())
							.log(Level.SEVERE, null, ex);
				}
			}

		} else {
			JOptionPane.showMessageDialog(new JPanel(),
					"El archivo seleccionado no es un comprobante autorizado.",
					"ERROR", 0);
		}
	}

	private static String obtenerTipoComprobante(String docu) {
		if (docu.contains("<factura")) {
			return "FA";
		}
		return null;
	}

	public static void generarReporte(FacturaReporte xml, String numAut,
			String fechaAut) {
		ReporteUtil repUtil = new ReporteUtil();
		try {
			repUtil.generarReporte("resources/reportes/factura.jasper", xml,
					numAut, fechaAut);
		} catch (SQLException ex) {
			Logger.getLogger(VisualizacionRideUtil.class.getName()).log(
					Level.SEVERE, null, ex);
		} catch (ClassNotFoundException ex) {
			Logger.getLogger(VisualizacionRideUtil.class.getName()).log(
					Level.SEVERE, null, ex);
		}
	}

}